#include <Semaforo.h>

using namespace std;
#include <iostream>

Semaforo::Semaforo(char *nombre, int valorInicial){

	this->valorinicial=valorInicial;
	key_t clave = ftok(nombre,'r');

	if(clave==-1)
		cout<<"error al crear la clave semaforo ("<< nombre <<")"<<endl;

	this->id=semget(clave,1,0777 | IPC_CREAT);
	int respuesta=this->inicializar();
	if(respuesta==-1)
		cout<<"error al crear el semaforo ("<< nombre <<")"<<endl;
}

Semaforo::~Semaforo(){
	semctl(this->id,0,IPC_RMID);
}

int Semaforo::inicializar(){
	
	union semnum{
		int val;
		struct semid_ds *buf;
		ushort* array;
	};

	semnum init;
	init.val=this->valorinicial;
	int resultado=semctl(this->id,0,SETVAL,init);
	return resultado;
}

int Semaforo::p(){
	struct sembuf operacion;

	operacion.sem_num=0;	//numero de semaforo
	operacion.sem_op=-1;	//resta 1 al semaforo
	operacion.sem_flg=0;	//esperar hasta obtener el semaforo

	int resultado=semop(this->id,&operacion,1);
	return resultado;
}

int Semaforo::v(){
	struct sembuf operacion;

	operacion.sem_num=0;	//numero de semaforo
	operacion.sem_op=1;	//sumar 1 al semaforo
	operacion.sem_flg=0;	//esperar hasta obtener el semaforo

	int resultado=semop(this->id,&operacion,1);
	return resultado;
}
